package com.atdfrz.secondshop.service.impl;

import com.atdfrz.secondshop.mapper.AddressMapper;
import com.atdfrz.secondshop.pojo.Address;
import com.atdfrz.secondshop.service.IAddressService;
import com.atdfrz.secondshop.service.IDistrictService;
import com.atdfrz.secondshop.service.ex.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

//@Service
//public class AddressServiceImpl extends ServiceImpl<AddressMapper, Address1>
//    implements AddressService {
//
//
//
//}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

@Service
public class AddressServiceImpl implements IAddressService {

        @Autowired(required = false)
        private AddressMapper addressMapper;
        @Autowired(required = false)
        private IDistrictService districtService;

        @Value("${user.address.max-count}")
        private int maxCount;

        @Override
        public void addNewAddress(Integer userid, String username, Address address) {
            // 根据参数uid调用addressMapper的countByUid(Integer uid)方法，统计当前用户的收货地址数据的数量
            Integer count = addressMapper.countByUid(userid);
            // 判断数量是否达到上限值
            if (count > maxCount) {
                // 是：抛出AddressCountLimitException
                throw new AddressCountLimitException("除默认地址外，收货地址数量已经达到上限(" + maxCount + ")！");
            }

            // 补全数据：省、市、区的名称
            String provinceName = districtService.getNameByCode(address.getProvinceCode());
            String cityName = districtService.getNameByCode(address.getCityCode());
            String areaName = districtService.getNameByCode(address.getAreaCode());
            address.setProvinceName(provinceName);
            address.setCityName(cityName);
            address.setAreaName(areaName);

            // 补全数据：将参数uid封装到参数address中
            address.setUserid(userid);
            // 补全数据：根据以上统计的数量，得到正确的isDefault值(是否默认：0-不默认，1-默认)，并封装
            Integer isDefault = count == 0 ? 1 : 0;
            address.setIsDefault(isDefault);
            // 补全数据：4项日志
            Date now = new Date();
            address.setCreatedUser(username);
            address.setCreatedTime(now);
            address.setModifiedUser(username);
            address.setModifiedTime(now);

            // 调用addressMapper的insert(Address address)方法插入收货地址数据，并获取返回的受影响行数
            Integer rows = addressMapper.insert(address);
            // 判断受影响行数是否不为1
            if (rows != 1) {
                // 是：抛出InsertException
                throw new InsertException("插入收货地址数据时出现未知错误，请联系系统管理员！");
            }
        }

        @Override
        public List<Address> getByUserid(Integer userid) {
            List<Address> list = addressMapper.findByUid(userid);
            System.out.println(list);
            return list;
        }

        @Transactional
        @Override
        public void setDefault(Integer aid, Integer userid, String username) {
            // 根据参数aid，调用addressMapper中的findByAid()查询收货地址数据
            Address result = addressMapper.findByAid(aid);
            // 判断查询结果是否为null
            if (result == null) {
                // 是：抛出AddressNotFoundException
                throw new AddressNotFoundException("尝试访问的收货地址数据不存在");
            }

            // 判断查询结果中的uid与参数uid是否不一致(使用equals()判断)
            if (!result.getUserid().equals(userid)) {
                // 是：抛出AccessDeniedException
                throw new AccessDeniedException("非法访问的异常");
            }

            // 调用addressMapper的updateNonDefaultByUid()将该用户的所有收货地址全部设置为非默认，并获取返回受影响的行数
            Integer rows = addressMapper.updateNonDefaultByUid(userid);
            // 判断受影响的行数是否小于1(不大于0)
            if (rows < 1) {
                // 是：抛出UpdateException
                throw new UpdateException("设置默认收货地址时出现未知错误[1]");
            }

            // 调用addressMapper的updateDefaultByAid()将指定aid的收货地址设置为默认，并获取返回的受影响的行数
            rows = addressMapper.updateDefaultByAid(aid, username, new Date());
            // 判断受影响的行数是否不为1
            if (rows != 1) {
                // 是：抛出UpdateException
                throw new UpdateException("设置默认收货地址时出现未知错误[2]");
            }
        }

        @Transactional
        @Override
        public void delete(Integer aid, Integer userid, String username) {
            // 根据参数aid，调用findByAid()查询收货地址数据
            Address result = addressMapper.findByAid(aid);
            // 判断查询结果是否为null
            if (result == null) {
                // 是：抛出AddressNotFoundException
                throw new AddressNotFoundException("尝试访问的收货地址数据不存在");
            }

            // 判断查询结果中的uid与参数uid是否不一致(使用equals()判断)
            if (!result.getUserid().equals(userid)) {
                // 是：抛出AccessDeniedException：非法访问
                throw new AccessDeniedException("非常访问");
            }

            // 根据参数aid，调用deleteByAid()执行删除
            Integer rows1 = addressMapper.deleteByAid(aid);
            if (rows1 != 1) {
                throw new DeleteException("删除收货地址数据时出现未知错误，请联系系统管理员");
            }

            // 判断查询结果中的isDefault是否为0
            if (result.getIsDefault() == 0) {
                return;
            }

            // 调用持久层的countByUid()统计目前还有多少收货地址
            Integer count = addressMapper.countByUid(userid);
            // 判断目前的收货地址的数量是否为0
            if (count == 0) {
                return;
            }

            // 调用findLastModified()找出用户最近修改的收货地址数据
            Address lastModified = addressMapper.findLastModified(userid);
            // 从以上查询结果中找出aid属性值
            Integer lastModifiedAid = lastModified.getAid();
            // 调用持久层的updateDefaultByAid()方法执行设置默认收货地址，并获取返回的受影响的行数
            Integer rows2 = addressMapper.updateDefaultByAid(lastModifiedAid, username, new Date());
            // 判断受影响的行数是否不为1
            if (rows2 != 1) {
                // 是：抛出UpdateException
                throw new UpdateException("更新收货地址数据时出现未知错误，请联系系统管理员");
            }
        }

        @Override
        public Address getByAid(Integer aid, Integer userid) {
            // 根据收货地址数据id，查询收货地址详情
            Address address = addressMapper.findByAid(aid);

            if (address == null) {
                throw new AddressNotFoundException("尝试访问的收货地址数据不存在");
            }
            if (!address.getUserid().equals(userid)) {
                throw new AccessDeniedException("非法访问");
            }
            address.setProvinceCode(null);
            address.setCityCode(null);
            address.setAreaCode(null);
            address.setCreatedUser(null);
            address.setCreatedTime(null);
            address.setModifiedUser(null);
            address.setModifiedTime(null);
            return address;
        }

    @Override
    public void change(Integer aid, Integer userid, String username) {
        // 根据参数aid，调用findByAid()查询收货地址数据
        Address result = addressMapper.findByAid(aid);
        // 判断查询结果是否为null
        if (result == null) {
            // 是：抛出AddressNotFoundException
            throw new AddressNotFoundException("尝试访问的收货地址数据不存在");
        }

        // 判断查询结果中的uid与参数uid是否不一致(使用equals()判断)
        if (!result.getUserid().equals(userid)) {
            // 是：抛出AccessDeniedException：非法访问
            throw new AccessDeniedException("非常访问");
        }

        // 根据参数aid，调用deleteByAid()执行删除
        Integer rows1 = addressMapper.deleteByAid(aid);
        if (rows1 != 1) {
            throw new DeleteException("删除收货地址数据时出现未知错误，请联系系统管理员");
        }

        // 判断查询结果中的isDefault是否为0
        if (result.getIsDefault() == 0) {
            return;
        }

        // 调用持久层的countByUid()统计目前还有多少收货地址
        Integer count = addressMapper.countByUid(userid);
        // 判断目前的收货地址的数量是否为0
        if (count == 0) {
            return;
        }

        // 调用findLastModified()找出用户最近修改的收货地址数据
        Address lastModified = addressMapper.findLastModified(userid);
        // 从以上查询结果中找出aid属性值
        Integer lastModifiedAid = lastModified.getAid();
        // 调用持久层的updateDefaultByAid()方法执行设置默认收货地址，并获取返回的受影响的行数
        Integer rows2 = addressMapper.updateDefaultByAid(lastModifiedAid, username, new Date());
        // 判断受影响的行数是否不为1
        if (rows2 != 1) {
            // 是：抛出UpdateException
            throw new UpdateException("更新收货地址数据时出现未知错误，请联系系统管理员");
        }
    }

}